package com.atguigu.gmall.feign.product;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.product.vo.CategoryTreeVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.Map;

/**
 * @author lfy
 * @Description  category业务的 feignclient（负责远程调用）
 * @create 2023-07-15 10:38
 */
@RequestMapping("/api/inner/product")
/**
 *  @FeignClient("service-product")： 指定的名字有两层含义
 *  1、service-product：我们要调用的远程服务
 *  2、每个feign客户端的配置会在底层保存一个组件对象，名字就叫 service-product ，
 *          配置在 service-product.FeignClientSpecification
 *  报错：The bean 'service-product.FeignClientSpecification' could not be registered. A bean with that name has already been defined and overriding is disabled.
 *  解决：
 *    1）、配置 spring.main.allow-bean-definition-overriding=true #新bean覆盖旧bean
 *    2）、把所有同一个服务的远程调用方法，都合并放在一个类里面
 */
@FeignClient("service-product")  //声明这是一个用来进行远程调用的客户端; 无需配置网关，直连远程服务
public interface CategoryFeignClient {


    /**
     * 1、别人调用 getCategoryTree()；
     * 2、feignclient找nacos要到 service-product 的ip和端口
     * 3、service-product的ip:port/api/inner/product/category/tree 发送请求
     *      1）、建立链接（和 service-product的ip:port ）
     *      2）、把数据序列化发送出去
     *      3）、等待对方响应 json 数据（序列化的数据）
     *      4）、把对方响应的json数据，反序列化转为 我们方法的返回值类型、
     *      5）、关闭链接
     *
     * @return
     */
    @GetMapping("/category/tree")  //方法的返回值只要和远程的json数据能兼容就行了
    Result<List<CategoryTreeVo>> getCategoryTree();

}
